/**
 * Copyright (c) 2002-2011 旭鸣信息
 * All rights reserved. 
 * File：AuthUserFilter.java
 * History:
 *       Apr 23, 2012: Initially created, liuzhi.
 */
package com.xteam.ecsystem.utils;

import java.io.IOException;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.xteam.ecsystem.action.UserCenterAction;
import com.xteam.ecsystem.base.Constant;

/**
 * 配置用户过滤器，防止用户访问部分未被授权的资源
 * @author liuzhi
 * 
 */
public class AuthUserFilter implements Filter {

	/**
	 * 销毁过滤器
	 * @see javax.servlet.Filter#destroy()
	 */
	public void destroy() {

	}

	/**
	 * 过滤未登录用户访问页面资源
	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
	 *      javax.servlet.ServletResponse, javax.servlet.FilterChain)
	 *      ServletRequest对象,此对象给过滤器提供了对进入的信息（包括表单数据、cookie和HTTP请求头）的完全访问。
	 *      ServletResponse对象，通常在简单的过滤器中忽略此参数。 FilterChain，此参数用来调用servlet或JSP页。
	 */
	public void doFilter(ServletRequest servletRequest,
			ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {

		// 如果处理HTTP请求，并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法，
		// 就要把此request对象构造成HttpServletRequest
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;

		// 取得根目录所对应的绝对路径
		String currentURL = request.getRequestURI();
		
		// 获得要拦截的特殊地址索引
		//Integer index = currentURL.lastIndexOf("/");
		//String targetURL = currentURL.substring(index, currentURL.length());
		
		if(UserCenterAction.isFilterUrl(currentURL)){
			HttpSession session = request.getSession(false);
			
			// 判断当前页是否是重定向以后的登录页面，如果是就不做session的判断，防止出现死循环 
			if (session == null || session.getAttribute(Constant.VAR_MEMBER.value()) == null) {
				System.out.println("提示：用户会话超时或不存在，访问资源已被拦截!["+ StringUtil.dateToStr(new Date(), null) + "]");
				
				response.sendRedirect(request.getContextPath() + "/user/login.xhtml");
				return;
			}
		}

		/**
		 * 调用FilterChain对象的doFilter方法。
		 * Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。
		 * 在调用此对象的doFilter方法时，激活下一个相关的过滤器。
		 * 如果没有另一个过滤器与servlet或JSP页面关联，则servlet或JSP页面被激活。
		 */
		filterChain.doFilter(request, response);

	}

	/**
	 * 初始化过滤器
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
	 */
	public void init(FilterConfig arg0) throws ServletException {

	}

}
